// #include <stdio.h>
// #include <omp.h>

// // 模拟工作函数，打印当前线程信息
// void work(int i, int j) {
//     int tid = omp_get_thread_num();
//     printf("Thread %d: work(%d, %d)\n", tid, i, j);
// }

// // 内层循环函数，启动独立的并行区域处理 j 循环
// void work1(int i, int n)
// {
//     int j;
//     #pragma omp parallel default(shared)
//     {
//         #pragma omp for
//         for(j = 0; j < n; j++){
//             work(i, j);
//         }
//     }
// }

// // 外层并行区域，调用 work1
// void good_nesting2(int n)
// {
//     int i;
//     #pragma omp parallel default(shared)
//     {
//         #pragma omp for
//         for(i = 0; i < n; i++){
//             work1(i, n);
//         }
//     }
// }

// int main() {
//     int n = 4;  // 设置循环次数
//     good_nesting2(n);
//     return 0;
// }


#include <stdio.h>
#include <omp.h>

// 模拟工作函数，打印当前线程及处理的循环变量信息
void work(int i, int j) {
    int tid = omp_get_thread_num();
    printf("Thread %d: work(%d, %d)\n", tid, i, j);
}

// 内层并行区域函数
void work1(int i, int n) {
    int j;
    // 指定内层区域使用 4 个线程
    #pragma omp parallel num_threads(4) default(shared)
    {
        #pragma omp for
        for(j = 0; j < n; j++){
            work(i, j);
        }
    }
}

// 外层并行区域函数
void good_nesting2(int n) {
    int i;
    // 指定外层区域使用 4 个线程
    #pragma omp parallel num_threads(4) default(shared)
    {
        #pragma omp for
        for(i = 0; i < n; i++){
            work1(i, n);
        }
    }
}

int main() {
    // 启用嵌套并行
    omp_set_nested(1);
    int n = 4;  // 定义循环次数
    good_nesting2(n);

    printf("Press Enter to exit...\n");
    getchar();
    return 0;
}
